#include <iostream>
#include <signal.h>
#include <unistd.h>

void handler(int signo)
{
    std::cout << "cat a signo: " << signo << std::endl;
}

void printpending(sigset_t &pending)
{
    for (int signo = 31; signo >= 1; --signo)
    {
        if (sigismember(&pending, signo))  std::cout << "1";
        else  std::cout << "0";
    }
    std::cout << "   pid: " << getpid() << std::endl;
}

int main()
{
    // 0. 对2号信号进行自定义捕捉、
    signal(2, handler);

    // 1. 先对2号信号进行屏蔽 
    sigset_t bset, oset;   
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset, 2);

    // 调用系统调用，将数据设置进内核，屏蔽2号信号
    sigprocmask(SIG_SETMASK, &bset, &oset);

    // 2. 重复打印当前进程的pending
    sigset_t pending;
    int cnt = 0;
    while (true)
    {
        // 2.1 获取当前pending
        int n = sigpending(&pending);
        if (n < 0)  continue;

        // 2.2 打印pending
        printpending(pending);
        sleep(1);

        // 2.3 解除阻塞
        ++cnt;
        if (cnt == 10)
        {
            std::cout << "unblock 2 signo" << std::endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr); 
        }
    }


    return 0;
}